package models

import (
	"errors"
	"fmt"
	"strings"

	"github.com/beego/beego/v2/core/logs"
	b "github.com/beego/beego/v2/server/web"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
)

var Db *gorm.DB

func InitModel() error {
	var err error
	mysqlConfig := ""
	mysqlConfig, err = b.AppConfig.String("mysqlConfig")
	if err != nil {
		logs.Error("读取app.conf.mysqlConfig发生错误：", err)
		return err
	}

	config := strings.Split(mysqlConfig, ",")
	if len(config) != 3 {
		errMsg := "app.conf.mysqlConfig格式不正确，正确的格式是：“用户名,密码,数据库名称”。"
		logs.Error(errMsg)
		err = errors.New(errMsg)
		return err
	}

	connStr := "%s:%s@/%s?charset=utf8mb4&parseTime=true&loc=Local"
	connStr = fmt.Sprintf(connStr, config[0], config[1], config[2])
	Db, err = gorm.Open(mysql.Open(connStr), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true, // 表名不需要复数(不需要附加字母s)
		},
	})
	if err != nil {
		logs.Error("连接到数据库发生错误：", err)
		return err
	}

	sqlDB, err := Db.DB()
	if err != nil {
		logs.Error("实例化数据库操作对象发生错误：", err)
		return err
	}

	sqlDB.SetMaxOpenConns(100) // 最大连接数
	sqlDB.SetMaxIdleConns(10)  // 最大空闲连接数

	// 基本表
	data := []interface{}{Logger{}, Menu{}, Resource{}, User{}, Role{}}

	// 业务表
	data = append(data, []interface{}{
		Bottle{}, UploadHistory{}, Journal{},
	}...)

	// 根据模型(结构体)创建数据表
	err = Db.AutoMigrate(data...)
	// 3个点是解构，写法等同于：AutoMigrate(Model1{}, Model2{}, Model3{})
	if err != nil {
		logs.Error("建表发生错误：", err)
		return err
	}

	//logs.Info("数据表已准备好。")
	return nil
}
